#!/bin/bash
# 用户服务启动脚本 - RedFire框架版本
# ======================================

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_debug() {
    if [[ "${USER_SERVICE_DEBUG:-false}" == "true" ]]; then
        echo -e "${BLUE}[DEBUG]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
    fi
}

# 错误处理
handle_error() {
    log_error "启动脚本在第 $1 行发生错误"
    exit 1
}

trap 'handle_error $LINENO' ERR

# 显示启动横幅
show_banner() {
    cat << 'EOF'
 ____           _ _____ _          
|  _ \ ___  __| |  ___(_)_ __ ___ 
| |_) / _ \/ _` | |_  | | '__/ _ \
|  _ <  __/ (_| |  _| | | | |  __/
|_| \_\___|\__,_|_|   |_|_|  \___|

用户服务 v2.0.0 - RedFire框架版本
======================================
EOF
}

# 验证环境变量
validate_environment() {
    log_info "验证环境变量配置..."
    
    local required_vars=(
        "USER_SERVICE_JWT_SECRET_KEY"
        "USER_SERVICE_DATABASE_URL"
        "USER_SERVICE_REDIS_URL"
    )
    
    local missing_vars=()
    
    for var in "${required_vars[@]}"; do
        if [[ -z "${!var}" ]]; then
            missing_vars+=("$var")
        fi
    done
    
    if [[ ${#missing_vars[@]} -gt 0 ]]; then
        log_error "缺少必需的环境变量:"
        for var in "${missing_vars[@]}"; do
            log_error "  - $var"
        done
        exit 1
    fi
    
    # 验证JWT密钥长度
    if [[ ${#USER_SERVICE_JWT_SECRET_KEY} -lt 32 ]]; then
        log_error "JWT密钥长度不足32字符，当前长度: ${#USER_SERVICE_JWT_SECRET_KEY}"
        exit 1
    fi
    
    log_info "环境变量验证通过"
}

# 等待依赖服务
wait_for_service() {
    local host=$1
    local port=$2
    local service_name=$3
    local timeout=${4:-30}
    
    log_info "等待 $service_name 服务启动 (${host}:${port})..."
    
    local count=0
    while ! nc -z "$host" "$port" 2>/dev/null; do
        if [[ $count -ge $timeout ]]; then
            log_error "$service_name 服务启动超时"
            exit 1
        fi
        
        log_debug "等待 $service_name... ($count/$timeout)"
        sleep 1
        ((count++))
    done
    
    log_info "$service_name 服务已准备就绪"
}

# 等待数据库
wait_for_database() {
    if [[ -n "${USER_SERVICE_DATABASE_URL}" ]]; then
        # 解析数据库URL
        local db_url="${USER_SERVICE_DATABASE_URL}"
        
        # 提取主机和端口 (简化的解析)
        if [[ $db_url =~ postgresql://[^@]*@([^:]+):([0-9]+) ]]; then
            local db_host="${BASH_REMATCH[1]}"
            local db_port="${BASH_REMATCH[2]}"
            wait_for_service "$db_host" "$db_port" "PostgreSQL" 60
        elif [[ $db_url =~ mysql://[^@]*@([^:]+):([0-9]+) ]]; then
            local db_host="${BASH_REMATCH[1]}"
            local db_port="${BASH_REMATCH[2]}"
            wait_for_service "$db_host" "$db_port" "MySQL" 60
        else
            log_warn "无法解析数据库URL，跳过数据库连接检查"
        fi
    fi
}

# 等待Redis
wait_for_redis() {
    if [[ -n "${USER_SERVICE_REDIS_URL}" ]]; then
        # 解析Redis URL
        local redis_url="${USER_SERVICE_REDIS_URL}"
        
        if [[ $redis_url =~ redis://([^:]+):([0-9]+) ]]; then
            local redis_host="${BASH_REMATCH[1]}"
            local redis_port="${BASH_REMATCH[2]}"
            wait_for_service "$redis_host" "$redis_port" "Redis" 30
        else
            log_warn "无法解析Redis URL，跳过Redis连接检查"
        fi
    fi
}

# 运行数据库迁移
run_database_migrations() {
    log_info "检查数据库迁移..."
    
    # 这里应该运行实际的数据库迁移命令
    # 由于具体的迁移工具未知，这里跳过
    log_info "数据库迁移检查完成"
}

# 验证配置
validate_configuration() {
    log_info "验证服务配置..."
    
    # 运行配置验证脚本
    if [[ -f "/app/scripts/validate_config.py" ]]; then
        python /app/scripts/validate_config.py
        if [[ $? -eq 0 ]]; then
            log_info "服务配置验证通过"
        else
            log_error "服务配置验证失败"
            exit 1
        fi
    else
        log_warn "配置验证脚本不存在，跳过配置验证"
    fi
}

# 执行健康检查
run_health_check() {
    log_info "执行启动前健康检查..."
    
    # 这里可以运行一些启动前的健康检查
    # 比如验证关键文件是否存在，权限是否正确等
    
    # 检查关键文件
    local required_files=(
        "/app/app/main.py"
        "/app/config/service_config.py"
    )
    
    for file in "${required_files[@]}"; do
        if [[ ! -f "$file" ]]; then
            log_error "关键文件不存在: $file"
            exit 1
        fi
    done
    
    # 检查目录权限
    local required_dirs=(
        "/var/log"
        "/app/data"
        "/app/tmp"
    )
    
    for dir in "${required_dirs[@]}"; do
        if [[ ! -d "$dir" ]]; then
            log_warn "目录不存在，创建: $dir"
            mkdir -p "$dir"
        fi
        
        if [[ ! -w "$dir" ]]; then
            log_error "目录无写权限: $dir"
            exit 1
        fi
    done
    
    log_info "启动前健康检查通过"
}

# 设置信号处理
setup_signal_handlers() {
    log_info "设置信号处理器..."
    
    # 优雅关闭函数
    graceful_shutdown() {
        log_info "收到关闭信号，开始优雅关闭..."
        
        # 如果有子进程，给它们发送TERM信号
        if [[ -n "$app_pid" ]]; then
            log_info "向应用进程发送TERM信号: $app_pid"
            kill -TERM "$app_pid" 2>/dev/null || true
            
            # 等待进程关闭
            local count=0
            while kill -0 "$app_pid" 2>/dev/null && [[ $count -lt 30 ]]; do
                sleep 1
                ((count++))
            done
            
            # 如果进程还在运行，强制终止
            if kill -0 "$app_pid" 2>/dev/null; then
                log_warn "应用进程未在30秒内关闭，强制终止"
                kill -KILL "$app_pid" 2>/dev/null || true
            fi
        fi
        
        log_info "用户服务已关闭"
        exit 0
    }
    
    # 注册信号处理器
    trap graceful_shutdown SIGTERM SIGINT
}

# 启动应用
start_application() {
    log_info "启动用户服务应用..."
    
    # 确定启动命令
    local cmd=("$@")
    if [[ ${#cmd[@]} -eq 0 ]]; then
        cmd=("uvicorn" "app.main:app" "--host" "0.0.0.0" "--port" "8001")
    fi
    
    # 根据环境调整启动参数
    if [[ "${USER_SERVICE_ENVIRONMENT:-development}" == "production" ]]; then
        # 生产环境配置
        cmd+=("--workers" "${USER_SERVICE_WORKERS:-4}")
        cmd+=("--worker-class" "uvicorn.workers.UvicornWorker")
        cmd+=("--access-log")
        cmd+=("--log-level" "${USER_SERVICE_LOG_LEVEL:-info}")
    else
        # 开发环境配置
        cmd+=("--reload")
        cmd+=("--log-level" "debug")
    fi
    
    log_info "启动命令: ${cmd[*]}"
    
    # 启动应用
    exec "${cmd[@]}" &
    app_pid=$!
    
    log_info "用户服务已启动，PID: $app_pid"
    
    # 等待应用进程
    wait $app_pid
}

# 显示环境信息
show_environment_info() {
    log_info "环境信息:"
    log_info "  服务名称: ${USER_SERVICE_SERVICE_NAME:-user-service}"
    log_info "  服务版本: ${USER_SERVICE_SERVICE_VERSION:-2.0.0}"
    log_info "  运行环境: ${USER_SERVICE_ENVIRONMENT:-development}"
    log_info "  服务端口: ${USER_SERVICE_PORT:-8001}"
    log_info "  调试模式: ${USER_SERVICE_DEBUG:-false}"
    log_info "  Python版本: $(python --version)"
    log_info "  工作目录: $(pwd)"
    log_info "  用户: $(whoami)"
    
    if [[ "${USER_SERVICE_DEBUG:-false}" == "true" ]]; then
        log_debug "详细环境变量:"
        env | grep "USER_SERVICE_" | sort | while read -r line; do
            # 屏蔽敏感信息
            if [[ $line =~ (PASSWORD|SECRET|KEY)= ]]; then
                key=$(echo "$line" | cut -d'=' -f1)
                log_debug "  $key=***"
            else
                log_debug "  $line"
            fi
        done
    fi
}

# 主函数
main() {
    # 显示启动横幅
    show_banner
    
    # 显示环境信息
    show_environment_info
    
    # 验证环境变量
    validate_environment
    
    # 设置信号处理
    setup_signal_handlers
    
    # 等待依赖服务
    wait_for_database
    wait_for_redis
    
    # 运行数据库迁移
    run_database_migrations
    
    # 验证配置
    validate_configuration
    
    # 执行健康检查
    run_health_check
    
    # 启动应用
    log_info "所有准备工作完成，启动用户服务..."
    start_application "$@"
}

# 如果是直接执行此脚本
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi
